package ongd.web;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import ongd.negocio.gestion.ControladorUsuario;
import ongd.negocio.gestion.Usuario;
import ongd.servicios.persistencia.exceptions.IllegalOrphanException;
import ongd.servicios.persistencia.exceptions.NonexistentEntityException;
import org.primefaces.context.RequestContext;

/**
 * Clase que se encargará de listar los usuarios activos.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@ManagedBean
@ViewScoped
public class Listado_Usuario extends ABean {

    /**
     * Objeto del tipo controladroUsuario que nos servirá para realizar
     * todas las operaciones necesarias para modificar y borrar un usuario.
     */
    private ControladorUsuario contUsuario;
    /**
     * Objeto de tipo lista de usuarios que guarda todos los usuarios activos de la aplicación.
     */
    private List<Usuario> usuarios;
    /**
     * Objeto de tipo usuario que guarda los datos del usuario con el que queremos trabajar.
     */
    private Usuario usuario;
    /**
     * Booleano que nos indica si vamos a editar un usuario.
     */
    private boolean editar;
    /**
     * Objeto de tipo string que recoge la contraseña anterior del usuario.
     */
    private String passAnt;
    /**
     * Objeto de tipo string que recoge la contraseña nueva.
     */
    private String passNueva1;
    /**
     * Objeto de tipo string que guarda la contraseña nueva de comprobación.
     */
    private String passNueva2;
    /**
     * Objeto de tipo String que va a contener el título de la página donde
     * estemos.
     */
    private String titulo;

    /** 
     * Constructor de la clase.
     */
    public Listado_Usuario() {
        SesionBean sesion = getSesionBean();
        if (sesion.iniciadaSesion()) {
            titulo = "Gestionar - Usuario";
            contUsuario = sesion.getControladorUsuario();
            usuarios = new ArrayList<Usuario>();
            usuario = new Usuario();
            usuarios = contUsuario.obtenerUsuariosActivos();
        }
    }

    /**
     * Método que carga los valores iniciales en función del modo de acceso a la página.
     */
    @Override
    public void cargaInicial() {
    }

    /**
     * Método que edita un usuario.
     * @return null.
     */
    public String aceptar() {
        if (getSesionBean().iniciadaSesion()) {
            RequestContext requestContext = RequestContext.getCurrentInstance();
            try {
                if (editar) {
                    //Si hemos dado a editar, comprobamos los campos.
                    if (usuario.getNombre().compareTo("") != 0 && usuario.getApellidos().compareTo("") != 0) {
                        //Mirar si desea recibir avisos y tiene email
                        if ((usuario.getAvisos() && usuario.getEmail().compareTo("") != 0) || !usuario.getAvisos()) {
                            if (contUsuario.editarUsuario(usuario)) {
                                requestContext.addCallbackParam("usuarioEditado", true);
                                requestContext.addPartialUpdateTarget("form:panel");
                            } else {
                                requestContext.addCallbackParam("usuarioNoEditado", true);
                            }
                        } else {
                            requestContext.addCallbackParam("faltaEmail", true);
                        }
                    } else {
                        requestContext.addCallbackParam("faltanDatos", true);
                    }
                } else {
                    requestContext.addCallbackParam("consultar", true);
                }
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(Listado_Usuario.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(Listado_Usuario.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(Listado_Usuario.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que borrar un usuario.
     * @return null.
     */
    public String borrar() {
        if (getSesionBean().iniciadaSesion()) {
            RequestContext requestContext = RequestContext.getCurrentInstance();
            try {
                if (contUsuario.borrarUsuario(usuario)) {
                    usuarios = contUsuario.obtenerUsuariosActivos();
                    requestContext.addCallbackParam("borrado", true);
                } else {
                    requestContext.addCallbackParam("noBorrado", true);
                }
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(Listado_Usuario.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(Listado_Usuario.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que desactiva un usuario.
     * @return null.
     */
    public String desactivar() {
        if (getSesionBean().iniciadaSesion()) {
            RequestContext requestContext = RequestContext.getCurrentInstance();
            try {
                if (contUsuario.desactivarUsuario(usuario)) {
                    usuarios = contUsuario.obtenerUsuariosActivos();
                    requestContext.addCallbackParam("desactivado", true);
                } else {
                    requestContext.addCallbackParam("noDesactivado", true);
                }
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(Listado_Usuario.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(Listado_Usuario.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(Listado_Usuario.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que modifica la contraseña de un usuario.
     * @return null.
     */
    public String cambiarContrasenna() {
        RequestContext requestContext = RequestContext.getCurrentInstance();
        //Si la contrasena anterior es igual a la de usuario se puede proceder a cambiarla.
        if (passAnt.compareTo(usuario.getPassword()) == 0 && passNueva1.compareTo(passNueva2) == 0 && passNueva1.compareTo("") != 0) {
            usuario.setPassword(passNueva1);
            setPassAnt("");
            setPassNueva1("");
            setPassNueva2("");
            requestContext.addCallbackParam("nuevaContraseña", true);
            requestContext.addPartialUpdateTarget("form:display2");
        } else {
            setPassAnt("");
            setPassNueva1("");
            setPassNueva2("");
            requestContext.addCallbackParam("antiguaContraseña", true);
            requestContext.addPartialUpdateTarget("form:display2");
        }
        return null;
    }

    /**
     * Método que modifica la variable para consultar los datos del usuario.
     * @return null.
     */
    public String consultar() {
        editar = false;
        return null;
    }

    /**
     * Método que modifica la variable para editar los datos del usuario.
     * @return null.
     */
    public String editar() {
        editar = true;
        return null;
    }

    /**
     * Metodo que devuelve el controlador de usuario.
     * @return controlador de usuario.
     * @see #setContUsuario
     */
    public ControladorUsuario getContUsuario() {
        return contUsuario;
    }

    /**
     * Método que nos dice si vamosa  editar el usuario.
     * @return true si le vamosa  editar o false si solo le vamos a consultar.
     */
    public boolean isEditar() {
        return editar;
    }

    /**
     * Método que devuelve el usuario con el que estamos trabajando.
     * @return usuario. 
     * @see #setUsuario
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * Método que devuelve la lista de usuarios activos.
     * @return lista de usuarios.
     * @see #setUsuarios
     */
    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    /**
     * Método que devuelve la contraseña anterior.
     * @return contraseña anterior.
     * @see #setPassAnt
     */
    public String getPassAnt() {
        return passAnt;
    }

    /**
     * Método que devuelve la contraseña nueva.
     * @return nueva contraseña.
     * @see #setPassNueva1
     */
    public String getPassNueva1() {
        return passNueva1;
    }

    /**
     * Método que devuelve la contraseña nueva de comprobación.
     * @return nueva contraseña. 
     * @see #setPassNueva2
     */
    public String getPassNueva2() {
        return passNueva2;
    }

    /**
     * Método que asigna un nuevo valor al controlador de usuario.
     * @param contUsuario nuevo valor del controlador 
     * @see #getContUsuario
     */
    public void setContUsuario(ControladorUsuario contUsuario) {
        this.contUsuario = contUsuario;
    }

    /**
     * Método que asigna un nuevo valor a la variable que indica si vamos a editar.
     * @param editar nuevo valor de la variable.
     */
    public void setEditar(boolean editar) {
        this.editar = editar;
    }

    /**
     * Método que asigna un nuevo valor al usuario.
     * @param usuario nuevo usuario
     * @see #getUsuario
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**
     * Método que asigna una nueva lista de usuarios activos.
     * @param usuarios nueva lista de usuarios
     * @see #getUsuarios
     */
    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    /**
     * Método que asigna un nuevo valor a la contraseña antigua.
     * @param passAnt nuevo alor 
     * @see #getPassAnt
     */
    public void setPassAnt(String passAnt) {
        this.passAnt = passAnt;
    }

    /**
     * Método que asigna un nuevo valor a la contraseña nueva.
     * @param passNueva1 nuevo valor 
     * @see #getPassNueva1
     */
    public void setPassNueva1(String passNueva1) {
        this.passNueva1 = passNueva1;
    }

    /**
     * Método que asigna un nuevo valor a la contraseña nueva de comprobación.
     * @param passNueva2 nuevo valor
     * @see #getPassNueva2
     */
    public void setPassNueva2(String passNueva2) {
        this.passNueva2 = passNueva2;
    }

    /**
     * Método que devuelve el valor de la variable titulo.
     * @return titulo
     * @see #setTitulo
     */
    public String getTitulo() {
        return titulo;
    }

    /**
     * Método que establece el valor de la variable título.
     * @param titulo Nuevo valor de la variable
     * @see #getTitulo
     */
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
}
